#pragma once

// #include <string_view>
#include <algorithm>
#include <string>
#include <vector>
#include <unordered_map>
#include <functional>

#include "macros/errors.h"
#include "utils/filesystem/filesystem.h"
#include "backend/kernel_interface/kernel_mainc_group.h"

namespace fs = std::filesystem;

namespace txdnn {
TXDNN_STR_VIEW GetKernelSrc(const fs::path& kernel_src);
TXDNN_STR_VIEW GetKernelInc(const fs::path& kernel_header);
const std::vector<std::reference_wrapper<const fs::path>>& GetKernelIncList();

namespace backend {

// #if TXDNN_BACKEND_MAINC
// #include "backend/kernel_interface/kernel_mainc_group.h"
using Kernel        = KernelMainCGroup;
using KernelInvoke  = KernelInvokeMainCGroup;
using Program       = ProgramMainCGroup;

// #elif TXDNN_BACKEND_OPLIB
// #include "backend/kernel_interface/kernel_oplib.h"


// #elif TXDNN_BACKEND_TXDNN
// #include "backend/kernel_interface/kernel_txdnn.h"

// #endif

} // namespace backend
} // namespace txdnn